package br.com.werp.regras.documento.visao;

import br.com.werp.regras.documento.controle.ControleDominio;
import br.com.werp.regras.documento.integracao.DominioDAO;
import br.com.werp.regras.documento.integracao.FabricaDAO;
import br.com.werp.regras.geral.Debuger;
import br.com.werp.regras.geral.GerenciadorErros;
import br.com.werp.regras.geral.util.Util;
import br.com.werp.regras.geral.visao.taglib.MasterTag;
import br.com.werp.regras.geral.vos.documento.DocumentoDominioVO;
import br.com.werp.regras.geral.vos.tabelas.Dominio;
import br.com.werp.regras.geral.vos.tabelas.Tipo_documento;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.PropertyUtils;

import java.io.IOException;

import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspWriter;


/**
 * @author Sobreira
 * Criado em 14/06/2006
 */
public class TipoDocumentoTag extends MasterTag {
    private static final long serialVersionUID = 8130973674099456568L;
    private String dominio;
    private String dominios;
    private String nome;
    private String docm_tipo;
    private ControleDominio controleDominio = new ControleDominio();

    public String getDocm_tipo() {
        return docm_tipo;
    }

    public void setDocm_tipo(String docm_tipo) {
        this.docm_tipo = docm_tipo;
    }

    public String getDominio() {
        return dominio;
    }

    public String getDominios() {
        return dominios;
    }

    public void setDominios(String dominios) {
        this.dominios = dominios;
    }

    public void setDominio(String dominio) {
        this.dominio = dominio;
    }

    public void otherDoStartTagOperations() {
        HttpServletRequest request =
            (HttpServletRequest) pageContext.getRequest();
        docm_tipo = (String) request.getAttribute("docm_tipo");

        if (Util.isNullOrEmpty(nome)) {
            nome = "docm_tipo";
        }

        if (Util.isNullOrEmpty(docm_tipo)) {
            try {
                Object bean =
                    request.getAttribute("org.apache.struts.taglib.html.BEAN");
                Map beanDescribe = BeanUtils.describe(bean);

                if (beanDescribe.containsKey(nome)) {
                    docm_tipo = PropertyUtils.getProperty(bean, nome).toString();
                }
            } catch (Exception e) {
                Debuger.debugar(e, getClass());
            }
        }

        if (Util.isNullOrEmpty(dominio)) {
            dominio = request.getContextPath().replaceAll("/", "");
        }

        if (!Util.isNullOrEmpty(dominios)) {
            try {
                gerarCombosMultiplosDominios();
            } catch (Exception e) {
                GerenciadorErros.logarErro(e);
            }
        } else {
            try {
                JspWriter out = pageContext.getOut();

                DocumentoDominioVO documentoDominioVO =
                    new DocumentoDominioVO();
                documentoDominioVO.setDomi_descricao(dominio);

                StringBuffer options = new StringBuffer();
                List dominios =
                    controleDominio.pesquisarDocumentoDominioVO(documentoDominioVO);

                StringBuffer optionsTodos = new StringBuffer();

                for (Iterator iter = dominios.iterator(); iter.hasNext();) {
                    documentoDominioVO = (DocumentoDominioVO) iter.next();
                    options.append("<option value=\"" +
                        documentoDominioVO.getTdoc_id() + "\" " +
                        (String.valueOf(documentoDominioVO.getTdoc_id())
                               .equals(docm_tipo) ? " 'selected' > " : ("" +
                        ">")));

                    options.append(documentoDominioVO.getTdoc_descricao());
                    optionsTodos.append(String.valueOf(
                            documentoDominioVO.getTdoc_id()) + ",");
                    options.append("</option>");
                }

                out.println("<select name=\"" + nome + "\" class=" + estilo +
                    ">");
                out.println("<option value=\"" +
                    optionsTodos.toString()
                                .substring(0,
                        optionsTodos.toString().length() - 1) + "\" > ");
                out.append("Todos</option>");
                out.println(options.toString());
                out.println("</select>");
            } catch (Exception e) {
                GerenciadorErros.logarErro(e);
            }
        }
    }

    private void gerarCombosMultiplosDominios() throws Exception {
        JspWriter out = pageContext.getOut();
        String[] dominiosArray = dominios.split(",");
        DominioDAO dominioDAO = FabricaDAO.getDominioDAO();
        StringBuffer options = new StringBuffer();

        Map domiMap = new HashMap();

        for (int i = 0; i < dominiosArray.length; i++) {
            Dominio dominio = new Dominio();
            dominio.setDomi_descricao(dominiosArray[i]);
            dominio = (Dominio) Util.get0(dominioDAO.pesquisarDominio(dominio));
            options.append("<option value=\"" + dominio.getDomi_id() + "\">");

            String domiDesc = dominio.getDomi_descricao();
            options.append(String.valueOf(domiDesc.charAt(0)).toUpperCase() +
                domiDesc.substring(1, domiDesc.length()));

            options.append("</option>");

            Tipo_documento tipo_documento = new Tipo_documento();
            tipo_documento.setTdoc_dominio(dominio.getDomi_id());

            List tipos = dominioDAO.pesquisarTipo_documento(tipo_documento);
            domiMap.put(dominio, tipos);
        }

        out.println("<select name=\"dominioCombo\" class=\"" + estilo +
            "\" onchange=comboChange(document.forms[0].dominioCombo.options[document.forms[0].dominioCombo.selectedIndex].value)  >");
        out.println(options.toString());
        out.println("</select>");
        out.println("<select name=\"" + nome + "\" class=\"" + estilo + "\"" +
            ">");

        out.println("</select>");

        out.println("<script>");

        for (Iterator iter = domiMap.keySet().iterator(); iter.hasNext();) {
            Dominio dominio = (Dominio) iter.next();
            List tipos = (List) domiMap.get(dominio);
            out.println("var Array" + dominio.getDomi_id() + " = new Array(");

            StringBuffer buffer = new StringBuffer();

            for (Iterator iterator = tipos.iterator(); iterator.hasNext();) {
                Tipo_documento tipo_documento =
                    (Tipo_documento) iterator.next();
                buffer.append("\"('" + tipo_documento.getTdoc_descricao() +
                    "'," + tipo_documento.getTdoc_id() + ")\",");
            }

            String arrays = buffer.toString();
            arrays = arrays.substring(0, arrays.length() - 1);
            out.println(arrays + ");");
        }

        out.println("function comboChange(selected){");
        out.println("var slave = document.forms[0]." + nome + ";");
        out.println("var selectedArray = eval(\"Array\"+selected);");
        out.println("while (selectedArray.length < slave.options.length){");
        out.println("slave.options[(slave.options.length - 1)] = null;}");
        out.println("for (var i=0; i < selectedArray.length; i++){");
        out.println(
            "eval(\"slave.options[i]=\" + \"new Option\" + selectedArray[i]);}");
        out.println("}");
        out.println(
            "comboChange(document.forms[0].dominioCombo.options[document.forms[0].dominioCombo.selectedIndex].value)");
        out.println("</script>");
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }
}
